/**
 * 
 * 多态：
 * 相同的事物，调用其相同的方法，参数也相同时，作用在不同的对象表现的行为却不同
 * 实现了方法的个性化，不同的子类根据具体状况可以实现不同的方法
 * 子类对父类的方法进行重写，调用这个方法时，会默认执行子类的方法，即实现多态
 * 参数个数不同, 执行不同的代码 :利用arguments.length判断来实现
 * eg:动物，对象继承
 * 装饰器模式
 */

abstract class Component{
    abstract drawStyle():void
}

class UnderLineInput extends Component{
    drawStyle(): void {
        console.log("下划线的输入框");
        
    }
}
class BorderInput extends Component{
    drawStyle(): void {
        console.log("边框的输入框");
    }
}

abstract class Director extends Component{
    private component:Component|null = null
    constructor(component :Component){
        super()
        this.component = component
    }
    abstract drawColor():void
    drawStyle(): void {
        if(this.component){
            this.component.drawStyle()
        }
        this.drawColor()
    }
}

class RedDirector extends Director{
    drawColor(): void {
        console.log("我是红颜色");
    } 
}

new RedDirector(new UnderLineInput()).drawColor()





// class Animal {
//     name = ""
//     call(){
//         console.log("call");
//     }
// }

// class Dog extends Animal{
//     call(){
//         console.log("汪汪汪");
//     }
// }

// class Cat extends Animal{
//     call(){
//         console.log("喵喵喵");
//     }
// }

// function test(animal:Animal){
//     if(animal){
//         animal.call()
//     }
// }
// test(new Dog())
// test(new Cat())